package com.example.ying.repository.neo4j;

import com.example.ying.model.domain.neo4j.Director;
import com.example.ying.model.domain.neo4j.Movie;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.neo4j.repository.query.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * movie的mapper
 */
@Repository
public interface MovieRepository extends Neo4jRepository<Movie,Long> {
    /**
     * 根据index 查询电影
     * @param index 电影index
     * @return 电影数据
     */
    @Query("MATCH (n:`电影`) where n.index=$index RETURN n")
    Movie findByIndex(@Param("index") String index);



    //获取导演index电影的导演
    @Query("MATCH (n:`导演`)-[r:`导演`]->(m:`电影`) where m.index=$index return n")
    List<Director> findDirectorByMovieIndex(@Param("index") String index);



    //获取属于index类型的电影
    @Query("MATCH (n:`电影`)-[r:`属于`]->(m:`类型`) where m.index=$index return n limit 10")
    List<Movie> findMovieByCategoryIndex(@Param("index") String index);

    //获取index导演导演的电影
    @Query("MATCH (n:`导演`)-[r:`导演`]->(m:`电影`) where n.index=$index return m")
    List<Movie> findMovieByDirectorIndex(@Param("index") String index);

    //获取index演员出演的电影
    @Query("MATCH (n:`演员`)-[r:`出演`]->(m:`电影`) where n.index=$index return m")
    List<Movie> findMovieByActorIndex(@Param("index") String index);

    //插入电影实体，包含title,index
    @Query("CREATE (n:`电影`) set n.title=$title,n.index=$index")
    void insertMovie(@Param("title") String title, @Param("index") int index);

    //插入导演实体，包含name,index
    @Query("CREATE (n:`导演`) set n.name=$name,n.index=$index")
    void insertDirector(@Param("name") String name, @Param("index") int index);

    //插入演员实体，包含name,index
    @Query("CREATE (n:`演员`) set n.name=$name,n.index=$index")
    void insertActor(@Param("name") String name, @Param("index") int index);

    //插入类型实体，包含name,index
    @Query("CREATE (n:`类型`) set n.name=$name,n.index=$index")
    void insertCategory(@Param("name") String name, @Param("index") int index);

    //插入电影与类型之间的关系，电影实体通过index关联类型实体
    @Query("MATCH (n:`电影`) where n.index=$index MATCH (m:`类型`) where m.name=$name create (n)-[r:`属于`]->(m)")
    //@Query("MATCH (n:`电影`),(m:`类型`) where n.index=$index and m.name=$name create (n)-[r:`属于`]->(m)")
    void insertMovieCategory(@Param("index") int index, @Param("name") String name);


    //判断电影是否存在
    @Query("MATCH (n:`电影`) where n.index=$0 return n")
    boolean existsMovieByIndex(String s);


    //通过Category查找电影
    @Query("MATCH (n:`电影`)-[r:`属于`]->(m:`类型`) where m.name=$0 return n")
    List<Movie> findMovieByCategory(String name);
}


